package com.lxs.doc.rocess.common;

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class DocxOutlineParser {
    /**
     * 大纲项实体类，存储标题级别和文本
     */
    public static class OutlineItem {
        private final int level;   // 标题级别（1-9）
        private final String text; // 标题文本

        public OutlineItem(int level, String text) {
            this.level = level;
            this.text = text;
        }

        public int getLevel() {
            return level;
        }

        public String getText() {
            return text;
        }

        @Override
        public String toString() {
            return "Level " + level + ": " + text;
        }
    }

    /**
     * 解析DOCX文档大纲
     * @param docxPath DOCX文件路径
     * @return 大纲列表（按文档中出现顺序排列）
     */
    public List<OutlineItem> parseOutline(String docxPath) {
        List<OutlineItem> outline = new ArrayList<>();

        try (XWPFDocument document = new XWPFDocument(new FileInputStream(docxPath))) {
            // 遍历文档中所有段落
            for (XWPFParagraph paragraph : document.getParagraphs()) {
                // 获取段落应用的样式名称（如"Heading 1"）
                String styleName = paragraph.getStyle();
                if (styleName == null) {
                    continue; // 跳过无样式的段落
                }

                // 提取标题级别（仅处理"Heading N"格式的样式）
                int level = extractHeadingLevel(styleName);
                if (level <= 0) {
                    continue; // 跳过非标题样式的段落
                }

                // 获取标题文本（去除首尾空白）
                String text = paragraph.getText().trim();
                if (!text.isEmpty()) {
                    outline.add(new OutlineItem(level, text));
                }
            }
        } catch (IOException e) {
            System.err.println("解析DOCX文档失败：" + e.getMessage());
        }

        return outline;
    }

    /**
     * 从样式名称中提取标题级别（如"Heading 1" -> 1）
     * @param styleName 样式名称
     * @return 标题级别（1-9，非标题样式返回0）
     */
    private int extractHeadingLevel(String styleName) {
        // 处理标准标题样式（如"Heading 1"、"Heading 2"）
        if (styleName.startsWith("Heading ")) {
            try {
                String levelStr = styleName.substring("Heading ".length());
                int level = Integer.parseInt(levelStr);
                return (level >= 1 && level <= 9) ? level : 0;
            } catch (NumberFormatException e) {
                return 0; // 样式名称格式异常（如"Heading A"）
            }
        }
        // 处理中文标题样式（如"标题1"、"标题2"）
        else if (styleName.startsWith("标题")) {
            try {
                String levelStr = styleName.substring("标题".length());
                int level = Integer.parseInt(levelStr);
                return (level >= 1 && level <= 9) ? level : 0;
            } catch (NumberFormatException e) {
                return 0;
            }
        }
        return 0; // 非标题样式
    }

    /**
     * 打印大纲（按层级缩进展示）
     * @param outline 大纲列表
     */
    public void printOutline(List<OutlineItem> outline) {
        if (outline == null || outline.isEmpty()) {
            System.out.println("未提取到大纲内容");
            return;
        }

        System.out.println("DOCX文档大纲：");
        for (OutlineItem item : outline) {
            // 按级别缩进（每级缩进2个空格）
            String indent = "  ".repeat(Math.max(0, item.getLevel() - 1));
            System.out.println(indent + item);
        }
    }

    // 示例用法
    public static void main(String[] args) {
        DocxOutlineParser parser = new DocxOutlineParser();
        String docxPath = "D:\\360MoveData\\Users\\14046\\Desktop\\测试文档.docx"; // 替换为实际DOCX文件路径
        List<OutlineItem> outline = parser.parseOutline(docxPath);
        parser.printOutline(outline);
    }
}
